package com.zhouyong.leetcode.从尾到头打印链表剑指offer06;

import com.zhouyong.leetcode.ListNode;

/**
 * @Author 99
 * @Date 2022/9/30 17:53
 * @Version 1.0
 */
public class Test {

    // 输入一个链表的头节点，从尾到头反过来返回每个节点的值（用数组返回）
    // 输入：head = [1,3,2]
    // 输出：[2,3,1]
    public static void main(String[] args) {
        int[] reversePrint = reversePrint(new ListNode(0, new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5, null)))))));
        for (int i : reversePrint) {
            System.out.println(i);
        }
    }

    public static int[] reversePrint(ListNode head) {

        // 复杂写法
//        LinkedList<Integer> list = new LinkedList<>();
//        while (head != null) {
//            list.add(head.val);
//            head = head.next;
//        }
//        Collections.reverse(list);
//        return list.stream().mapToInt(Integer::intValue).toArray();

        // 先反转链表，再用数组输出
        // 执行用时：0 ms, 在所有 Java 提交中击败了100.00%的用户
        // 内存消耗：41.9 MB, 在所有 Java 提交中击败了72.56%的用户
        // 计算链表的长度
        int count = 0;
        ListNode result = head;
        while (head != null) {
            head = head.next;
            count++;
        }

        // 反转链表
        int[] b = new int[count];
        int index = 0;
        ListNode ans = null;
        for (ListNode a = result; a != null; a = a.next) {
            ans = new ListNode(a.val, ans);
        }
        while (ans != null) {
            b[index] = ans.val;
            ans = ans.next;
            index++;
        }
        return b;
    }
}
